package com.example.demo.utils;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.OutputStream;
import java.util.Hashtable;

/**
 * 生成二维码的工具类
 */
public class QRCodeUtil {

    private static final String CHARSET = "utf-8";
    private static final String FORMAT_NAME = "JPG";
    // 二维码尺寸
    private static final int QRCODE_SIZE = 400;
    private static final int QRCODE_HIGH = 500;
    // LOGO宽度
    private static final int WIDTH = 100;
    // LOGO高度
    private static final int HEIGHT = 100;

    private static BufferedImage createImage(String content, String imgPath, boolean needCompress,String carNo) throws Exception {
        Hashtable hints = new Hashtable();
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
        hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
        hints.put(EncodeHintType.MARGIN, 1);
        BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_HIGH,hints);
        int width = bitMatrix.getWidth();
        int height = bitMatrix.getHeight();
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        for (int x = 0; x < width; x++) {
            for (int y = 0; y < height; y++) {
                image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);
            }
        }
        if (imgPath == null || "".equals(imgPath)) {
            return image;
        }
        // 插入图片
        QRCodeUtil.insertImage(image, imgPath, needCompress,carNo);
        BufferedImage bufferedImage = QRCodeUtil.addWaterMark("/file/back.png", "/file/"+carNo+".png", image,carNo);
//        BufferedImage bufferedImage = addWaterMark(ConvertTemplatePath.convertTemplatePath("/file/back.png"), "C:/Users/Eric/Desktop/aa.png", image,carNo);
        System.out.println("bufferedImage"+bufferedImage);
        return bufferedImage;
    }


    private static void insertImage(BufferedImage source, String imgPath, boolean needCompress, String carNo) throws Exception {
//        File file = ResourceUtils.getFile(imgPath);
        File file = ConvertTemplatePath.convertTemplatePathToFile("/file/logo.png");
        if (!file.exists()) {
            System.out.println("" + imgPath + "该文件不存在！");
            return;
        }
        Image src = ImageIO.read(file);
        int width = src.getWidth(null);
        int height = src.getHeight(null);
        if (needCompress) { // 压缩LOGO
            if (width > WIDTH) {
                width = WIDTH;
            }
            if (height > HEIGHT) {
                height = HEIGHT;
            }
            Image image = src.getScaledInstance(width, height, Image.SCALE_SMOOTH);
            BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            Graphics g = tag.getGraphics();
//            g.setFont(new Font("粗体", qrcodeFont.getFontStyle(), qrcodeFont.getFontSize()));

            g.drawImage(image, 0, 0, null); // 绘制缩小后的图
            g.dispose();
            src = image;
        }
        // 插入LOGO
        Graphics2D graph = source.createGraphics();
        int x = (QRCODE_SIZE - width) / 2;
        int y = (QRCODE_HIGH - height) / 2;
        graph.drawImage(src, x, y, width, height, null);
        graph.setColor(Color.black);
        graph.setFont(new Font("黑体", Font.BOLD, 35));
//        System.out.println("graph"+graph);
        graph.drawString(carNo, 125, 480);
//        System.out.println("画起来324242"+carNo);
////        graph.drawString("carNo", 125, 480);
        graph.dispose();
    }


    public static void encode(String content, String imgPath, String destPath, boolean needCompress,String carNo) throws Exception {
        BufferedImage image = QRCodeUtil.createImage(content, imgPath, needCompress,carNo);
        mkdirs(destPath);
        ImageIO.write(image, FORMAT_NAME, new File(destPath));
    }


    public static BufferedImage encode(String content, String imgPath, boolean needCompress) throws Exception {
        BufferedImage image = QRCodeUtil.createImage(content, imgPath, needCompress,null);
        return image;
    }


    public static void mkdirs(String destPath) {
        File file = new File(destPath);
        // 当文件夹不存在时，mkdirs会自动创建多层目录，区别于mkdir．(mkdir如果父目录不存在则会抛出异常)
        if (!file.exists() && !file.isDirectory()) {
            file.mkdirs();
        }
    }


    public static void encode(String content, String imgPath, OutputStream output, boolean needCompress,String carNo)
            throws Exception {
        BufferedImage image = QRCodeUtil.createImage(content, imgPath, needCompress,carNo);
        ImageIO.write(image, FORMAT_NAME, output);
    }


    public static void encode(String content, OutputStream output) throws Exception {
        QRCodeUtil.encode(content, null, output, false,null);
    }


    /***
     * 在一张背景图上添加二维码
     * @param bigImgPath 背景图的路径
     * @param outPathWithFileName 输出路径
     */
    private static BufferedImage addWaterMark(String bigImgPath, String outPathWithFileName,BufferedImage QRcoder,String carNo) throws Exception {
            // 读取原图片信息
            File srcImgFile = ConvertTemplatePath.convertTemplatePathToFile("/file/back.png");//得到文件
            Image srcImg = ImageIO.read(srcImgFile);//文件转化为图片
            int srcImgWidth = srcImg.getWidth(null);//获取图片的宽
            int srcImgHeight = srcImg.getHeight(null);//获取图片的高
            // 加水印
            BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
            Graphics2D g = bufImg.createGraphics();
            g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
//        String content = "时光蹉跎看淡岁月你我";
            //使用工具类生成二维码
//        Image image = QRCodeUtil.createImages(content);
            //将小图片绘到大图片上,500,300 .表示你的小图片在大图片上的位置。
            g.drawImage(QRcoder, 410, 60, null);
            //设置颜色。
            g.setColor(Color.WHITE);
            g.dispose();
            return bufImg;
        // 输出图片
//        FileOutputStream outImgStream = new FileOutputStream(outPathWithFileName);
//        ImageIO.write(bufImg, "png", outImgStream);
//        System.out.println("添加水印完成");
//        outImgStream.flush();
//        outImgStream.close();
    }


}